package cn.com.cfae.iras.doc.analyze.components.iaad;

import cn.com.cfae.iras.doc.analyze.beans.iaad.IaadIndicatorGradeDetail;
import cn.com.cfae.iras.doc.analyze.beans.iaad.IndustryIndicatorList;
import cn.com.cfae.iras.doc.analyze.beans.web.ContentAndPosition;
import cn.com.cfae.iras.doc.analyze.components.BaseComponent;
import cn.com.cfae.iras.doc.analyze.components.beans.ComponentResult;
import cn.com.cfae.iras.doc.analyze.parse.kv.KVText;
import cn.com.cfae.iras.doc.analyze.parse.model.ExtractBizModel;
import cn.com.cfae.iras.doc.analyze.parse.model.ExtractItem;
import com.google.gson.GsonBuilder;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.MapUtils;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * Created by 佟媛媛 on 18/11/7.
 * 钢铁
 */

@Component("GT03")
@Scope("prototype")
public class GT03 extends BaseComponent {

    private static Logger log = LoggerFactory.getLogger(GT03.class);

    public List<IaadIndicatorGradeDetail> handlerIAAD(){
        List<IaadIndicatorGradeDetail> list = new ArrayList<>();

        List<IaadIndicatorGradeDetail> CNLYL = getCNLYL();//产能利用率
        if(CollectionUtils.isNotEmpty(CNLYL)) list.addAll(CNLYL);
        List<IaadIndicatorGradeDetail> CNGM = getCNGM();//产量规模
        if(CollectionUtils.isNotEmpty(CNGM)) list.addAll(CNGM);
        List<IaadIndicatorGradeDetail> RJCGL = getRJCGL();//人均产钢量
        if(CollectionUtils.isNotEmpty(RJCGL)) list.addAll(RJCGL);
        IaadIndicatorGradeDetail ZFZ_ZZC = getZFZ_ZZC();//资产负债率
        if(ZFZ_ZZC!=null) list.add(ZFZ_ZZC);
        IaadIndicatorGradeDetail JLR_ZZC = getJLR_ZZC();//总资产报酬率
        if(JLR_ZZC!=null) list.add(JLR_ZZC);
        IaadIndicatorGradeDetail HDXJL_DQJK = getHDXJL_DQJK();//经营活动现金流入量/短期借款（倍）
        if(HDXJL_DQJK!=null) list.add(HDXJL_DQJK);
        IaadIndicatorGradeDetail SXZC_ZZC = getSXZC_ZZC();//受限资产比重
        if(SXZC_ZZC!=null) list.add(SXZC_ZZC);
        IaadIndicatorGradeDetail CHZZTS = getCHZZTS();//存货周转天数
        if(CHZZTS!=null) list.add(CHZZTS);
        IaadIndicatorGradeDetail ZWRZGJYE_YXZW = getZWRZGJYE_YXZW();//债务融资工具余额在有息债务中的占比
        if(ZWRZGJYE_YXZW!=null) list.add(ZWRZGJYE_YXZW);
        log.info("钢铁行业指标：{}",new GsonBuilder().create().toJson(list));
        return list;
    }

    //产能利用率
    /**
     1、产能利用率 --》CNLYL
     "1、M5；
     2、近一年；
     3、指粗钢；"
     单位：%
     */
    private List<IaadIndicatorGradeDetail> getCNLYL(){
        try{
            IndustryIndicatorList indicator = getIndustryIndicatorList("CNLYL");
            List<IaadIndicatorGradeDetail> list = new ArrayList<>();
            List<KVText> kvTextList = getKVTextValues("M-5","GT","CNLYL");
            int pageNum = getChapterModel("M-5").getStartPage();
            if(CollectionUtils.isNotEmpty(kvTextList)){
                for(KVText kvText : kvTextList){
                    String value = kvText.getText();
                    double v = getDouble(value);
                    List<ContentAndPosition> textPositionList = getContentAndPositionList2(kvText);
                    if(StringUtils.isEmpty(value)){
                        continue;
                    }
                    IaadIndicatorGradeDetail iaadIndicatorGradeDetail = getIaadIndicatorGradeDetail(indicator,textPositionList,doubleToBigDecimal(v),"",pageNum,String.format("产能利用率%s",value));
                    if(iaadIndicatorGradeDetail!=null) list.add(iaadIndicatorGradeDetail);
                }
            }
            return list;
        }catch (Exception e){
            log.error(e.getMessage(),e);
            return null;
        }
    }

    //产量规模
    /**
     2、产量规模 --》CNGM
     "1、M5；
     2、近一年；
     3、指粗钢；"
     单位：万吨
     */
    private List<IaadIndicatorGradeDetail> getCNGM(){
        try{
            IndustryIndicatorList indicator = getIndustryIndicatorList("CLGM");
            List<IaadIndicatorGradeDetail> list = new ArrayList<>();
            List<KVText> kvTextList = getKVTextValues("M-5","GT","CNGM");
            int pageNum = getChapterModel("M-5").getStartPage();
            if(CollectionUtils.isNotEmpty(kvTextList)){
                for(KVText kvText : kvTextList){
                    String value = kvText.getText();
                    double v = getDouble(value);
                    List<ContentAndPosition> textPositionList = getContentAndPositionList2(kvText);
                    if(StringUtils.isEmpty(value)){
                        continue;
                    }
                    IaadIndicatorGradeDetail iaadIndicatorGradeDetail = getIaadIndicatorGradeDetail(indicator,textPositionList,doubleToBigDecimal(v),pageNum,value,String.format("产量规模%s",value));
                    if(iaadIndicatorGradeDetail!=null) list.add(iaadIndicatorGradeDetail);
                }
            }
            return list;
        }catch (Exception e){
            log.error(e.getMessage(),e);
            return null;
        }
    }

    //人均产钢量
    /**
     3、人均产钢量 --》RJCGL
     "1、M5；
     2、文本抽取，缺失提示；
     3、指粗钢；"
     单位：吨/人
     */
    private List<IaadIndicatorGradeDetail> getRJCGL(){
        try{
            IndustryIndicatorList indicator = getIndustryIndicatorList("RJCGL");
            List<IaadIndicatorGradeDetail> list = new ArrayList<>();
            List<KVText> kvTextList = getKVTextValues("M-5","GT","RJCGL");
            int pageNum = getChapterModel("M-5").getStartPage();
            if(CollectionUtils.isNotEmpty(kvTextList)){
                for(KVText kvText : kvTextList){
                    String value = kvText.getText();
                    double v = getDouble(value);
                    List<ContentAndPosition> textPositionList = getContentAndPositionList2(kvText);
                    if(StringUtils.isEmpty(value)){
                        continue;
                    }
                    IaadIndicatorGradeDetail iaadIndicatorGradeDetail = getIaadIndicatorGradeDetail(indicator,textPositionList,doubleToBigDecimal(v),pageNum,value,String.format("人均产钢量%s",value));
                    if(iaadIndicatorGradeDetail!=null) list.add(iaadIndicatorGradeDetail);
                }
            }
            return list;
        }catch (Exception e){
            log.error(e.getMessage(),e);
            return null;
        }
    }

    //资产负债率
    /**
     4、资产负债率（%） --》ZCFZL --》负债总额（负债总计、总负债）/资产总额（资产总计、总资产）--》ZFZ/ZZC
     --》M-6、ZCFZ.FZHJ、ZCFZ.ZCZJ
     "1、会计科目分析；
     2、近一年；"
     单位：%
     */
    private IaadIndicatorGradeDetail getZFZ_ZZC(){
        try{
            IndustryIndicatorList indicator = getIndustryIndicatorList("ZCFZL");
    //        直接抽取
            String ZCFZLS = null;
            double ZCFZLD = 0;
            int pageNum = getChapterModel("M-6").getStartPage();
            ExtractBizModel model = getModel("M-6","CZNL");
            Map<String, ExtractItem> CZNLcol = model.getTable(getJYN(model.getTables()));
            if(MapUtils.isNotEmpty(CZNLcol) && CZNLcol.get("ZCFZL")!=null && CZNLcol.get("ZCFZL").getValue()!=null){
                ZCFZLS = CZNLcol.get("ZCFZL").getValue().getText();
                ZCFZLD = (getDouble(ZCFZLS));
                pageNum = CZNLcol.get("ZCFZL").getValue().getPageNumber();
            }
            if(StringUtils.isEmpty(ZCFZLS)){
                return null;
            }
            if(!ZCFZLS.contains("%")) ZCFZLS=ZCFZLS+"%";
            return getIaadIndicatorGradeDetail(indicator,doubleToBigDecimal(ZCFZLD),"",pageNum,String.format("近一年资产负债率%s",ZCFZLS));
        }catch (Exception e){
            log.error(e.getMessage(),e);
            return null;
        }
//        公式计算
//        String FZHJS =null,ZCZJS = null;
//        double FZHJ1 =0,ZCZJ1 = 0,v1=0;
//        int pageNum = getChapterModel("M-6").getStartPage();
//        Map<String, ExtractItem> col1 = getModel("M-6","ZCFZ").getTable(getSNJYQ()[2]);
//        if(MapUtils.isNotEmpty(col1)){
//            if(col1.get("FZHJ")!=null && col1.get("FZHJ").getValue()!=null){
//                FZHJS = col1.get("FZHJ").getValue().getText();
//                FZHJ1 = getDouble(FZHJS);
//            }
//            if(col1.get("ZCZJ")!=null && col1.get("ZCZJ").getValue()!=null){
//                ZCZJS = col1.get("ZCZJ").getValue().getText();
//                ZCZJ1 = getDouble(ZCZJS);
//            }
//            if(FZHJ1!=0 && ZCZJ1!=0){
//                v1 = (FZHJ1/ZCZJ1);
//            }
//        }
//        if(StringUtils.isEmpty(FZHJS) && StringUtils.isEmpty(ZCZJS)){
//            return null;
//        }
//        return getIaadIndicatorGradeDetail(indicator,v1+"",pageNum,String.format("近一年负债总额%s，近一年资产总额%s",FZHJS,ZCZJS));
    }

    //总资产报酬率
    /**
     5、总资产报酬率（%） --》净利润/年末总资产 --》JLR/ZZC
     --》M-6、LR.JLR、ZCFZ.ZCZJ
     "1、会计科目分析；
     2、近一年；"
     单位：%
     */
    private IaadIndicatorGradeDetail getJLR_ZZC(){
        try{
            IndustryIndicatorList indicator = getIndustryIndicatorList("ZZCBCL");
            int pageNum = getChapterModel("M-6").getStartPage();
            ExtractBizModel JLRmodel = getModel("M-6","LR");
            ExtractBizModel ZZCmodel = getModel("M-6","ZCFZ");
            Map<String, ExtractItem> JLRcol1 = JLRmodel.getTable(getJYN(JLRmodel.getTables()));
            Map<String, ExtractItem> ZZCcol = ZZCmodel.getTable(getJYN(ZZCmodel.getTables()));
            String JLRS=null,ZCZJS=null;
            double JLR=0,ZCZJ=0,v=0;
            if(MapUtils.isNotEmpty(JLRcol1) && JLRcol1.get("JLR")!=null && JLRcol1.get("JLR").getValue()!=null){
                JLRS = JLRcol1.get("JLR").getValue().getText();
                JLR = getDouble(JLRS);
            }
            if(MapUtils.isNotEmpty(ZZCcol) && ZZCcol.get("ZCZJ")!=null && ZZCcol.get("ZCZJ").getValue()!=null){
                ZCZJS = ZZCcol.get("ZCZJ").getValue().getText();
                ZCZJ = getDouble(ZCZJS);
            }
            if(JLR!=0 && ZCZJ!=0){
                v = getTwoDecimal(JLR/ZCZJ);
            }
            if(StringUtils.isEmpty(JLRS) && StringUtils.isEmpty(ZCZJS)){
                return null;
            }
            JLRS=JLRS+JLRmodel.getUnitType();
            ZCZJS=ZCZJS+ZZCmodel.getUnitType();
            return getIaadIndicatorGradeDetail(indicator,doubleToBigDecimal(v),"%",pageNum,String.format("近一年净利润%s，近一年总资产%s",JLRS,ZCZJS));
        }catch (Exception e){
            log.error(e.getMessage(),e);
            return null;
        }
    }

    //经营活动现金流入量/短期借款（倍）
    /**
     6、经营活动现金流入量/短期借款（倍） --》HDXJL/DQJK
     --》M-6、XJLL.JYHDCSXJLLJE、ZCFZ.DQJK
     "1、M-6-1抽取；
     2、近一年；"
     单位：倍
     */
    private IaadIndicatorGradeDetail getHDXJL_DQJK(){
        try{
            IndustryIndicatorList indicator = getIndustryIndicatorList("JYHDXJLRL-DQJK");
            String JYHDCSXJLLS=null,DQJKS=null;
            double JYHDCSXJLL=0,DQJK=0,v=0;
            int pageNum = getChapterModel("M-6").getStartPage();
            ExtractBizModel XJLLmodel = getModel("M-6","XJLL");
            Map<String, ExtractItem> XJLLcol = XJLLmodel.getTable(getJYN(XJLLmodel.getTables()));
            if(MapUtils.isNotEmpty(XJLLcol) && XJLLcol.get("JYHDCSXJLLJE")!=null && XJLLcol.get("JYHDCSXJLLJE").getValue()!=null){
                JYHDCSXJLLS = XJLLcol.get("JYHDCSXJLLJE").getValue().getText();
                JYHDCSXJLL = getDouble(JYHDCSXJLLS);
            }
            ExtractBizModel ZCFZmodel = getModel("M-6","ZCFZ");
            Map<String, ExtractItem> ZCFZcol = ZCFZmodel.getTable(getJYN(ZCFZmodel.getTables()));
            if(MapUtils.isNotEmpty(ZCFZcol) && ZCFZcol.get("DQJK")!=null && ZCFZcol.get("DQJK").getValue()!=null){
                DQJKS = ZCFZcol.get("DQJK").getValue().getText();
                DQJK = getDouble(DQJKS);
            }
            if(JYHDCSXJLL!=0 && DQJK!=0){
                v = getTwoDecimal(JYHDCSXJLL/DQJK);
            }
            if(StringUtils.isEmpty(JYHDCSXJLLS) && StringUtils.isEmpty(DQJKS)){
                return null;
            }
            JYHDCSXJLLS=JYHDCSXJLLS+XJLLmodel.getUnitType();
            DQJKS=DQJKS+ZCFZmodel.getUnitType();
            return getIaadIndicatorGradeDetail(indicator,doubleToBigDecimal(v),"",pageNum,String.format("近一年经营活动现金流入量%s，近一年短期借款%s",JYHDCSXJLLS,DQJKS));
        }catch (Exception e){
            log.error(e.getMessage(),e);
            return null;
        }
    }

    //受限资产比重
    /**
     7、受限资产比重（%） --》受限资产/总资产 --》SXZC/ZZC
     --》M-6、SXZC.SXZC、ZCFZ.ZCZJ
     "1、受限资产可能会在M6中涉及，直接提取；
     2、受限资产缺失提示；
     3、如果可以获取到受限资产，和总资产进行测算；
     4、近一年；
     5、抵质押的情况下：账面价值、评估价值"
     单位：%
     */
    private IaadIndicatorGradeDetail getSXZC_ZZC(){
        try{
            IndustryIndicatorList indicator = getIndustryIndicatorList("SXZCBZ");
            int pageNum = getChapterModel("M-6").getStartPage();
            KVText SXZC_kvText = getKVTextValue("M-6","SXZC","SXZC");
            double SXZC=0,ZCZJ=0,v=0;
            String SXZCS=null,ZCZJS=null;
            ExtractBizModel model = getModel("M-6","ZCFZ");
            if(SXZC_kvText!=null){
                Map<String, ExtractItem> col = model.getTable(getJYN(model.getTables()));
                if(MapUtils.isNotEmpty(col) && col.get("ZCZJ")!=null && col.get("ZCZJ").getValue()!=null){
                    SXZCS = SXZC_kvText.getText();
                    SXZC = getDouble(SXZCS);
                    ZCZJS = col.get("ZCZJ").getValue().getText();
                    ZCZJ = getDouble(ZCZJS);
                    if(SXZC!=0 && ZCZJ!=0){
                        v = getTwoDecimal(SXZC/ZCZJ);
                    }
                }
            }
            if(StringUtils.isEmpty(SXZCS) && StringUtils.isEmpty(ZCZJS)){
                return null;
            }
            SXZCS=SXZCS+getModel("M-6","SXZC").getUnitType();
            ZCZJS=ZCZJS+model.getUnitType();
            return getIaadIndicatorGradeDetail(indicator,doubleToBigDecimal(v),"%",pageNum,String.format("近一年受限资产%s，近一年总资产%s",SXZCS,ZCZJS));
        }catch (Exception e){
            log.error(e.getMessage(),e);
            return null;
        }
    }

    //存货周转天数
    /**
     8、存货周转天数（天） --》CHZZTS
     --》M-6、YYNL.CHZZTS
     "1、M-6-2财务会计科目分析；
     2、直接提取，没有提示缺失；
     3、近一年；"
     单位：天
     */
    private IaadIndicatorGradeDetail getCHZZTS(){
        try{
            IndustryIndicatorList indicator = getIndustryIndicatorList("CHZZTS");
            String CHZZTS = null;
            double v1 = 0;
            int pageNum = getChapterModel("M-6").getStartPage();
            ExtractBizModel model = getModel("M-6","YYNL");
            Map<String, ExtractItem> col1 = model.getTable(getJYN(model.getTables()));
            if(MapUtils.isNotEmpty(col1) && col1.get("CHZZTS")!=null && col1.get("CHZZTS").getValue()!=null){
                CHZZTS = col1.get("CHZZTS").getValue().getText();
                v1 = getDouble(CHZZTS);
            }
            if(StringUtils.isEmpty(CHZZTS)){
                return null;
            }
            CHZZTS=CHZZTS+model.getUnitType();
            return getIaadIndicatorGradeDetail(indicator,doubleToBigDecimal(v1),"",pageNum,String.format("近一年存货周转天数%s",CHZZTS));
        }catch (Exception e){
            log.error(e.getMessage(),e);
            return null;
        }
    }

    //债务融资工具余额在有息债务中的占比
    /**
     9、债务融资工具余额在有息债务中的占比（%） --》债务融资工具余额/有息债务（全部债务） --》ZWRZGJYE/YXZW
     --》M-6、FXTK.ZWRZGJYE、ZCFZ.DQJK、ZCFZ.CQJK、ZCFZ.YNNDQFLDFZ、ZCFZ.YFZQ、ZCFZ.YFDQZQ、ZCFZ.YFCQZQ、ZCFZ.QTFLDFZ
     "1、M6提取有息债务；
     2、M3发行条款获取；"
     单位：%
     */
    private IaadIndicatorGradeDetail getZWRZGJYE_YXZW(){
        try{
            IndustryIndicatorList indicator = getIndustryIndicatorList("ZWRZGJYE-YXZW");
            String ZWRZGJYES=null,DQJKS=null,CQJKS=null,YNNDQFLDFZS=null,YFZQS=null,YFDQZQS=null,YFCQZQS=null,QTFLDFZS=null;
            double ZWRZGJYE=0,DQJK=0,CQJK=0,YNNDQFLDFZ=0,YFZQ=0,YFDQZQ=0,YFCQZQ=0,QTFLDFZ=0,ALL=0,v=0;
            int pageNum = getChapterModel("M-6").getStartPage();
            KVText ZWRZGJYET = getKVTextValue("M-3", "FXTK", "ZWRZGJYE");
            if(ZWRZGJYET!=null){
                ZWRZGJYES = ZWRZGJYET.getText();
                ZWRZGJYE = getDouble(ZWRZGJYES);
            }
            ExtractBizModel model = getModel("M-6","ZCFZ");
            Map<String, ExtractItem> ZCFZcol = model.getTable(getJYN(model.getTables()));
            if(MapUtils.isNotEmpty(ZCFZcol) && ZCFZcol.get("DQJK")!=null && ZCFZcol.get("DQJK").getValue()!=null){
                DQJKS = ZCFZcol.get("DQJK").getValue().getText();
                DQJK = getDouble(DQJKS);
            }
            if(MapUtils.isNotEmpty(ZCFZcol) && ZCFZcol.get("CQJK")!=null && ZCFZcol.get("CQJK").getValue()!=null){
                CQJKS = ZCFZcol.get("CQJK").getValue().getText();
                CQJK = getDouble(CQJKS);
            }
            if(MapUtils.isNotEmpty(ZCFZcol) && ZCFZcol.get("YNNDQFLDFZ")!=null && ZCFZcol.get("YNNDQFLDFZ").getValue()!=null){
                YNNDQFLDFZS = ZCFZcol.get("YNNDQFLDFZ").getValue().getText();
                YNNDQFLDFZ = getDouble(YNNDQFLDFZS);
            }
            if(MapUtils.isNotEmpty(ZCFZcol) && ZCFZcol.get("YFZQ")!=null && ZCFZcol.get("YFZQ").getValue()!=null){
                YFZQS = ZCFZcol.get("YFZQ").getValue().getText();
                YFZQ = getDouble(YFZQS);
            }
            if(MapUtils.isNotEmpty(ZCFZcol) && ZCFZcol.get("YFDQZQ")!=null && ZCFZcol.get("YFDQZQ").getValue()!=null){
                YFDQZQS = ZCFZcol.get("YFDQZQ").getValue().getText();
                YFDQZQ = getDouble(YFDQZQS);
            }
            if(MapUtils.isNotEmpty(ZCFZcol) && ZCFZcol.get("YFCQZQ")!=null && ZCFZcol.get("YFCQZQ").getValue()!=null){
                YFCQZQS = ZCFZcol.get("YFCQZQ").getValue().getText();
                YFCQZQ = getDouble(YFCQZQS);
            }
            if(MapUtils.isNotEmpty(ZCFZcol) && ZCFZcol.get("QTFLDFZ")!=null && ZCFZcol.get("QTFLDFZ").getValue()!=null){
                QTFLDFZS = ZCFZcol.get("QTFLDFZ").getValue().getText();
                QTFLDFZ = getDouble(QTFLDFZS);
            }
            ALL = DQJK+CQJK+YNNDQFLDFZ+YFZQ+YFDQZQ+YFCQZQ+QTFLDFZ;
            if(ZWRZGJYE!=0 && ALL!=0){
                v = getTwoDecimal(ZWRZGJYE/ALL);
            }
            if(StringUtils.isEmpty(ZWRZGJYES) && StringUtils.isEmpty(DQJKS) && StringUtils.isEmpty(CQJKS) && StringUtils.isEmpty(YNNDQFLDFZS) && StringUtils.isEmpty(YFZQS) &&
                    StringUtils.isEmpty(YFDQZQS) && StringUtils.isEmpty(YFCQZQS) && StringUtils.isEmpty(QTFLDFZS)){
                return null;
            }
            DQJKS=DQJKS+model.getUnitType();
            CQJKS=CQJKS+model.getUnitType();
            YNNDQFLDFZS=YNNDQFLDFZS+model.getUnitType();
            YFZQS=YFZQS+model.getUnitType();
            YFDQZQS=YFDQZQS+model.getUnitType();
            YFCQZQS=YFCQZQS+model.getUnitType();
            QTFLDFZS=QTFLDFZS+model.getUnitType();
            return getIaadIndicatorGradeDetail(indicator,doubleToBigDecimal(v),"%",pageNum,String.format("债务融资工具余额%s，短期借款%s，长期借款%s，一年内到期非流动负债%s，应付债券%s，应付短期债券%s，应付长期债券%s，其他非流动负债%s",ZWRZGJYES,DQJKS,CQJKS,YNNDQFLDFZS,YFZQS,YFDQZQS,YFCQZQS,QTFLDFZS));
        }catch (Exception e){
            log.error(e.getMessage(),e);
            return null;
        }
    }

    @Override
    public List<ComponentResult> handlerM() {
        return null;
    }

    @Override
    public List<ComponentResult> handlerBM() {
        return null;
    }

    @Override
    public List<ComponentResult> handlerDM() {
        return null;
    }

    @Override
    public List<ComponentResult> handlerBDM() {
        return null;
    }
}
